#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
#include <string.h>

//从栈底到栈顶遍历，打印输出
static void stackDump (lua_State *L) 
{
    int i;
    int top = lua_gettop(L);
    for (i = 1; i <= top; i++) 
    { /* repeat for each level */
        int t = lua_type(L, i);
        switch (t) 
        {
            case LUA_TSTRING: /* strings */
                printf("%02d %-10s: `%s'\r\n",i,lua_typename(L,t), lua_tostring(L, i));
                break;
            case LUA_TBOOLEAN: /* booleans */
                printf(lua_toboolean(L, i) ? "%02d %-10s: true\r\n" : "%02d %-10s: false\r\n",i,lua_typename(L,t) );
                break;
            case LUA_TNUMBER: /* numbers */
                printf("%02d %-10s: %g\r\n",i,lua_typename(L,t), lua_tonumber(L, i));
                break;
            case LUA_TNIL:
                printf("%02d %-10s: nil\r\n",i,lua_typename(L,t));
                break;
            default: /* other values */
                printf("%02d other type values: %-10s\r\n",i, lua_typename(L, t));
                break;
        }
    }
    printf("\n"); /* end the listing */
}
int main( void )
{
    char *pstr=NULL;
    //1.创建Lua状态  
    lua_State *L = luaL_newstate();  
    //2.加载Lua文件  
    int bRet = luaL_loadfile(L,"hello.lua");  
    if(bRet)  
    {  
        printf("load file error\n");  
        return 1;  
    }  
    //3.运行Lua文件  
    bRet = lua_pcall(L,0,0,0);

    //4.读取变量  
    lua_getglobal(L,"str");
    pstr = lua_tostring(L,-1);
    printf(" ");
    printf(pstr);
    //5.读取table  
    lua_getglobal(L,"tbl"); 
    //把table 中索引为name对应的值压入栈顶
    lua_getfield(L,-1,"name");  
    pstr = lua_tostring(L,-1);
    printf(" ");
    printf(pstr);
    //6.读取函数  
    lua_getglobal(L, "add");        // 获取函数，压入栈中
    lua_pushnumber(L, 10);          // 压入第一个参数
    lua_pushnumber(L, 20);          // 压入第二个参数
    int iRet= lua_pcall(L, 2, 1, 0);// 调用函数，调用完成以后，会将返回值压入栈中，2表示参数个数，1表示返回结果个数。
    if (iRet)                       // 调用出错  
    {  
        const char *pErrorMsg = lua_tostring(L, -1);  
        lua_close(L);  
        return ;  
    }  
    printf("\n");
    stackDump(L);
    if (lua_isnumber(L, -1))        //取值输出  
    {  
        double fValue = lua_tonumber(L, -1);  
        printf("Result is=%f \n",fValue);  
    }  

    // 将需要设置的值设置到栈中  
    lua_pushstring(L, "我是一个大帅锅～\n");  
    // 将这个值设置到table中（此时tbl在栈的位置为2）  
    lua_setfield(L, 2, "name");
    lua_getglobal(L,"tbl"); 
    lua_getfield(L,-1,"name");  
    pstr = lua_tostring(L,-1);
    printf(" ");
    printf(pstr);

    //7.关闭state  
    lua_close(L); 
    return 0;
}